package ar.edu.utn.frba.disenio.aterrizar;

import ar.edu.utn.frba.disenio.aterrizar.aerolineas.AdapterOceanic;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.AerolineaOceanic;
import ar.edu.utn.frba.disenio.aterrizar.aerolineas.AsientoDTO;
import ar.edu.utn.frba.disenio.aterrizar.busquedas.CriterioBusqueda;
import ar.edu.utn.frba.disenio.aterrizar.compra.ManagerCompras;
import ar.edu.utn.frba.disenio.aterrizar.reserva.ManagerReserva;
import ar.edu.utn.frba.disenio.aterrizar.reserva.Reserva;
import ar.edu.utn.frba.disenio.aterrizar.reserva.ReservaUsuario;
import ar.edu.utn.frba.disenio.aterrizar.usuario.Usuario;
import ar.edu.utn.frba.disenio.aterrizar.usuario.UsuarioEstandar;
import ar.edu.utn.frba.disenio.aterrizar.usuario.UsuarioNoPaga;
import ar.edu.utn.frba.disenio.aterrizar.usuario.UsuarioVip;
import static org.mockito.Mockito.*;
import org.junit.Test;
import static org.junit.Assert.*;
import java.math.BigDecimal;
import ar.edu.utn.frba.disenio.aterrizar.estrategia.*;

public class OceanicMockTest {
	
	Usuario usuarioEstandar1 = new UsuarioEstandar("Juan","Perez","123456");
	Usuario usuarioEstandar2 = new UsuarioEstandar("Pedro", "Lopez", "13205412");
	Usuario usuarioVip = new UsuarioVip("Laura","Rodriguez","9877654");
	Usuario usuarioNoPaga = new UsuarioNoPaga("Pepe","Argento","567842");

	ManagerReserva managerReserva = new ManagerReserva();
	
	CriterioBusqueda busqueda = new CriterioBusqueda("_BS","LA","15/08/2012", 1);
	
	EstrategiaLugar estrategiaDestino = new EstrategiaLA();
	EstrategiaLugar estrategiaOrigen = new EstrategiaFormatoOk();
	
	AerolineaOceanic mockAerolineaOceanic = mock(AerolineaOceanic.class);
	AerolineaOceanic mockitoOceanic = mockAerolineaOceanic.getInstance();
	AdapterOceanic mockAdapter = new AdapterOceanic(mockitoOceanic);
	ManagerCompras managerCompras = new ManagerCompras();
	
	AsientoDTO unAsiento = new AsientoDTO("OC100", 10, "15/08/2012","17/08/2012","10:35","05:35", new BigDecimal("3150.98"),"Ejecutiva","Pasillo",false,"_BS","SLA");
	
	/*
	@Test
	public void testAsientosTotales(){
		assertTrue((mockAdapter.asientosTotales()).size() == 18);
	}
	*/
	
	@Test
	public void testBuscarVuelos(){
		EstrategiaBusqueda estrategia = new EstrategiaParaOrigenYDestino();
		estrategia.setEstrategiaOrigen(new EstrategiaFormatoOk());
		estrategia.setEstrategiaDestino(new EstrategiaLA());
		mockAdapter.setEstrategiaBusqueda(estrategia);
		mockAdapter.buscarVuelos(busqueda);
	}
	
	@Test
	public void testParsearAsientoDTO(){
		mockAdapter.parsearAsientoDTOAVuelo(unAsiento);
	}
	
	/*
	@Test
	public void testBuscarVueloParticular(){
		mockAdapter.buscarVueloParticular("OC100-10", usuarioVip);
	}
	*/
	
	
	@Test
	public void testAgregarUnaReservaDeOceanicEnClaseManagerReserva(){
		managerReserva.reservar(mockAdapter, usuarioEstandar1, "OC100-30");
		Reserva unaReserva= managerReserva.getReservas().get(0);
		ReservaUsuario unaReservaUsuario=unaReserva.reservaUsuarios.get(0);
		String codAsiento = "OC100-30";
		String fecha=managerReserva.getFechaActual();
		assertTrue(unaReserva.codAsiento.equals(codAsiento) && unaReserva.aerolinea.equals(mockAdapter) && unaReservaUsuario.getFechaActual().equals(fecha) && unaReservaUsuario.getUsuario().equals(usuarioEstandar1));
	}
	
	@Test
	public void testBuscarUnaReservaDeOceanicEnClaseManagerReserva(){
		managerReserva.reservar(mockAdapter, usuarioEstandar1, "OC042-11");
		Reserva unaReserva=managerReserva.buscar(mockAdapter, "OC042-11");
		ReservaUsuario unaReservaUsuario=unaReserva.reservaUsuarios.get(0);
		String codAsiento = "OC042-11";
		String fecha=managerReserva.getFechaActual();
		assertTrue(unaReserva.codAsiento.equals(codAsiento) && unaReserva.aerolinea.equals(mockAdapter) && unaReservaUsuario.getFechaActual().equals(fecha) && unaReservaUsuario.getUsuario().equals(usuarioEstandar1));
	}
	
	
	@Test 
	public void testBorrarExpiradosDeUnaReservaDeOceanicEnClaseManagerReserva(){
		managerReserva.reservar(mockAdapter, usuarioEstandar1, "OC100-10");
		managerReserva.reservar(mockAdapter, usuarioEstandar2, "OC100-10");
		Reserva unaReserva=managerReserva.buscar(mockAdapter, "OC100-10");
		managerReserva.borrarExpirados(mockAdapter, "OC100-10");
		ReservaUsuario unaReservaUsuario=unaReserva.reservaUsuarios.get(0);
		String fecha=managerReserva.getFechaActual();
		assertTrue(unaReservaUsuario.getFechaActual().equals(fecha) && unaReservaUsuario.getUsuario().equals(usuarioEstandar2));
	}
	
	@Test
	public void testBorrarSobreReservasDeUnaReservaDeOceanicEnClaseManagerReserva(){
		usuarioEstandar1.reservar("OC888-19", mockAdapter, managerReserva);
		usuarioEstandar2.reservar("OC888-19", mockAdapter, managerReserva);
		Reserva unaReserva=managerReserva.buscar(mockAdapter, "OC888-19");
		managerReserva.borrarSobreReservas(mockAdapter, "OC888-19");
		int tamanioDespuesDeBorrar=unaReserva.reservaUsuarios.size();
		assertTrue(tamanioDespuesDeBorrar==1);
	}
	
	@Test
	public void testAgregarUsuarioDeUnaReservaDeOceanicEnClaseReserva(){
		managerReserva.reservar(mockAdapter, usuarioEstandar1, "OC042-12");
		Reserva unaReserva=managerReserva.buscar(mockAdapter, "OC042-12");
		String fecha=managerReserva.getFechaActual();
		unaReserva.agregarUsuario(usuarioEstandar2, fecha);
		int tamanioDespuesDeAgregar=unaReserva.reservaUsuarios.size();
		assertTrue(tamanioDespuesDeAgregar==2);
	}
	
	@Test
	public void testReservarAsientoOk(){
		usuarioEstandar1.reservar("OC100-12", mockAdapter, managerReserva);
	}
	
	@Test
	public void testReservar(){
		mockAdapter.reservar("OC042-13", usuarioEstandar1); 
	}
	
	@Test
	public void testSobreReservarOk(){
		usuarioEstandar1.reservar("OC100-12", mockAdapter, managerReserva);
		usuarioEstandar2.reservar("OC100-12", mockAdapter, managerReserva);
	}
	
	@Test
	public void testComprarAsiento(){
		mockAdapter.comprarAsiento("OC042-19", usuarioEstandar1);
	}

}
